home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / cw_write.arc / CWDKIT5.DOC < prev    next >
Text File  |  1990-04-22  |  32KB  |  674 lines

  1.  
  2.             Centiwrite 1.10 Developer's Kit and User's Manual
  3.              Both Items Copyright 1988 Andrew M. Saucci, Jr.
  4.  
  5.  Note that you may also inspect the copyright notice of the file CENTWRI5.TPU
  6.  by entering "copy centwri5.tpu /b con" at the DOS prompt. Ignore all the
  7.  beeping and stumbling and wait for this command to finish executing.
  8.  Also, if your copy of the compressed version of the Kit is named "CWDKIT.ARC"
  9.  you should rename it "CWDKIT5.ARC".
  10.  
  11.  ****************************************************************************
  12.  
  13.                Centiwrite 1.10 Developer's Kit User's Manual
  14.                ========== ==== =========== === ====== ======
  15.  
  16.                     Copyright 1988 Andrew M. Saucci, Jr.
  17.  
  18.                             What's to Follow
  19.  
  20.  1. Introduction
  21.  2. About the Author
  22.  3. The Interface of the Unit
  23.  4. What You'll Need to Compile
  24.  5. The Basic Principles
  25.  6. A Sample Calling Program
  26.  7. Analysis of the Sample Program
  27.  8. The Initial Values
  28.  9. Initializing the Array
  29. 10. How to Overlay the Unit
  30. 11. Compatibility Consideration
  31. 12. For Extra Punch in Your Program
  32. 13. Down to Brass Tacks
  33. 14. Boilerplate
  34. 15. To All Those Who Helped
  35. 16. Coming Attractions
  36. 17. It's Alive!
  37.  
  38.  =============================================================================
  39.  
  40.                              Introduction
  41.  
  42.           Congratulations on having acquired this useful developer's tool. Now
  43. you can have an "instant editor" in your own programs whenever you need to
  44. include the capability to create short memos, notes, or letters. This file
  45. will attempt to show you how to incorporate the Centiwrite 1.10 editor into
  46. your Turbo Pascal programs. If you are unfamiliar with this editor, you should
  47. definitely obtain a copy of the stand-alone version of Centiwrite and read its
  48. User's Manual. This explains in detail the operation of the editor. Of course,
  49. as a "developer" (one of the initiated), you'll gain access to some features
  50. not used in the stand-alone version.
  51.  
  52.  =============================================================================
  53.  
  54.                             About the Author
  55.  
  56.           Andrew M. Saucci, Jr. was graduated with distinction from the
  57. New York Institute of Technology with a master's degree in computer science.
  58. He received a bachelor's degree in computer science from Hofstra University.
  59. A member of the Association of Shareware Professionals (ASP) and the
  60. Association for Computing Machinery (ACM), Mr. Saucci has programmed in
  61. Turbo Pascal for over one year. He is also the author of the program
  62. The Holy Rosary.
  63.  
  64.           Mr. Saucci can be reached at any of the following electronic mail
  65. addresses:
  66.  
  67. CompuServe  72117,241
  68. Delphi      ASAUCCI
  69. Genie       A.SAUCCI3
  70. The Source  BFE501
  71. BIX         ASAUCCI
  72.  
  73.           Comments about any of his products are most welcome; however,
  74. please allow one week for a response to your initial inquiry. After that,
  75. an "active" mailbox is checked daily. Also, for guaranteed service, use
  76. the regular mail facility of your service rather than a bulletin board area,
  77. or send a regular mail note saying to check the bulletin board. One week is
  78. a "worst case" situation. Often, mailboxes are checked more frequently.
  79.  
  80.  =============================================================================
  81.  
  82.                         The Interface of the Unit
  83.  
  84. unit centwri5;
  85. interface
  86.     uses dos, crt;
  87.     type scarray= array [1..62] of string[85];
  88.          commstruc= record
  89.                     screline: scarray;
  90.                     lastring, initWhereX, initWhereY: byte;
  91.                     CurAttr, StdAttr, MessAttr, WarnAttr: byte;
  92.                     passkey: integer;
  93.                     TimeOutInterval, NextTimeOut, oldhours: word;
  94.                     BlankChar: char;
  95.                     insmode, RetCtrlKeys, ShowStatusLine, TimeOut: boolean;
  96.                     end;
  97.     function nextword (sentence: string): integer;
  98.     function lastword (sentence: string): integer;
  99.     function isletter (charcode: char): boolean;
  100.     function isdigit (charcode: char): boolean;
  101.     function datestring: string;
  102.     function timestring: string;
  103.     function CheckSumVidBuf (x1, y1, count: byte): word;
  104.     function BufChar (xlimit, ylimit: byte): byte;
  105.     procedure AnalyzeKey (var inkey: integer; var scancode: byte);
  106.     procedure DelWord (var sentence: string; position: integer);
  107.     procedure Centiwrite (var infoexch: commstruc);
  108.  
  109. implementation
  110. { Implementation would follow here. }
  111.  
  112.  
  113. Each of the variables used in the "commstruc" (for "communications structure"
  114. record is described below.
  115.  
  116. screline: The strings which represent each line of the text to a maximum of
  117.           62. This accomodates 25-, 43-, and 50-line screens.
  118.  
  119. lastring: The number of currently "valid" strings in screline. Because a line
  120.           consisting solely of a carriage return (ASCII 13-10) is represented
  121.           by a null string, "lastring" indicates how many lines of screline
  122.           are currently being used. Note that in an empty file, lastring is 1.
  123.  
  124. initWhereX: The initial x-coordinate of the cursor on entry to the editor.
  125.  
  126. initWhereY: The initial y-coordinate of the cursor on entry to the editor.
  127.  
  128. CurAttr: The color attribute of the cursor. You can use any valid attribute.
  129.          If the foreground and background are the same, the Centiwrite editor
  130.          assumes that the blinking hardware cursor is being used, and the
  131.          software cursor is disabled. The cursor will appear as a blinking
  132.          CHARACTER if a background color greater than 7 is used.
  133.  
  134. StdAttr: The normal color attribute of the editor.
  135.  
  136. MessAttr: The color attribute for messages which appear on the status line.
  137.  
  138. WarnAttr: The color attribute for the word "Overstrike" when visible.
  139.  
  140. TimeOutInterval: The number of minutes between timeouts. If this is set
  141.                  to zero, timeouts are disabled.
  142.  
  143. NextTimeOut: Time in minutes of the next timeout. If the next timeout is
  144.              at 4:43, this variable could have the values 43, 103, 163, ...
  145.              through 65535 (the maximum for a word), or (43+ 60*n), where
  146.              n is the number of hours to the next timeout. On the hour,
  147.              NextTimeOut is decremented by 60 (if it exceeds 59).
  148.  
  149. oldhours: Hours at the last time check. This is passed as part of the
  150.           structure because the calling program must initialize it before
  151.           the first call to Centiwrite. You should re-initialize it if
  152.           you leave Centiwrite for more than an hour. Basically, this is
  153.           used as a "rollover" flag.
  154.  
  155. passkey: The character passed back to the main program when Centiwrite does
  156.          not define a function for it. (This is now an INTEGER.)
  157.  
  158. BlankChar: The character that is displayed at the cursor position when
  159.            the character at that position is either ASCII zero, ASCII 32
  160.            (blank), or ASCII 255. All of these normally appear as a blank,
  161.            and you may need to choose an alternate character, particularly
  162.            for those using monochrome monitors. You may select any character
  163.            except ASCII 7, 8, 10, or 13.
  164.  
  165. insmode: If true, then the editor is in Insert mode. Otherwise, Overstrike
  166.          mode is used.
  167.  
  168. RetCtrlKeys: Set this to true if you want control keys (ASCII 1 to 31,
  169.              except 8, 9, and 13) returned to the calling program.
  170.              Otherwise, set it to false so that Ctrl-L, for example,
  171.              will insert an ASCII 12 (form-feed). Even if control keys
  172.              are returned, using the Alt+ numeric keypad method of
  173.              entering characters will always insert the appropriate
  174.              character, except for ASCII 7, 8, 10, and 13, which are
  175.              ignored. Backspace, Tab, and Enter are never returned this way.
  176.  
  177. ShowStatusLine: Set this flag to true if you require the status line,
  178.                 which shows the current state of Insert/Overstrike and
  179.                 the current position on the screen. If this is set to
  180.                 false, no status line is displayed and the top line
  181.                 is available for editing. When ShowStatusLine is false,
  182.                 the Insert key is returned to the calling procedure for
  183.                 action, so that any display or indication of the Insert/
  184.                 Overstrike mode that the caller maintains (in lieu of
  185.                 the status line) may be updated by the caller. Also, the
  186.                 F5, F8, and Ctrl-F8 keys are ignored (because they use
  187.                 the status line for their display).
  188.  
  189. TimeOut: When set to true, TimeOut indicates that the calling procedure
  190.          has received control on account of a timeout, and that the
  191.          appropriate timeout procedures or functions should be
  192.          executed. Otherwise, the caller received control because of
  193.          an unrecognized or Ctrl-key.
  194.  
  195. The functions and procedures which are included are summarized next.
  196.  
  197. nextword: Returns the position of the next word in a string. In the string
  198.           "for he's a jolly good fellow", nextword returns 4. If no "next
  199.           word" is found, the return value is the length of the string plus 1.
  200.  
  201. lastword: Returns the position of the last word in a string. In the string
  202.           "which nobody can deny", lastword returns 18. If the string is a
  203.           single word, the return value is 1.
  204.  
  205. datestring: Returns the current system date in the form "Monday, May 26, 1988".
  206.  
  207. timestring: Returns the current system time in the form "10:45:44 PM".
  208.  
  209. CheckSumVidBuf: Returns a checksum of the characters in the video buffer
  210.                 starting at a given location (in REAL coordinates-- not
  211.                 those recognized by the CRT unit) and continuing for
  212.                 count characters. This procedure is not used by the
  213.                 editor, but is included because it is important to
  214.                 all programmers who want to discourage tampering with
  215.                 their programs. (Real coordinates start at 0,0 and are
  216.                 not relative to the current window.)
  217.  
  218. BufChar: Returns the character at the cursor location and advances the
  219.          cursor one column to the right, or to the beginning of the
  220.          next line. "xlimit" is the x-coordinate (again, in real coordinates)
  221.          at which the cursor should wrap to the next line. "ylimit" is the
  222.          y-coordinate of the bottom of the screen. If the cursor is in the
  223.          lower right corner of the screen, the character is returned but
  224.          the cursor is not advanced. This function is also not used by
  225.          the editor, but it is the function that the stand-alone version
  226.          of Centiwrite uses to load a screen into the editor. Now you
  227.          can use it, too!
  228.  
  229. AnalyzeKey: Substitute keyboard reading procedure (for ReadKey). A single
  230.             call returns all pertinent keyboard information-- no need to
  231.             make multiple calls to check for extended key codes.
  232.             Extended key codes are returned in inkey as values in excess
  233.             of 255-- for example, F6 is returned as 322. Note that "inkey"
  234.             is an INTEGER variable. To get the value returned in "inkey",
  235.             add 256 to the extended key code (F6 is 322, or 64+ 256).
  236.             This procedure is now written in assembly language for
  237.             extra speed.
  238.  
  239. DelWord: Deletes the word starting at a given location in a string.
  240.  
  241. Centiwrite: The editor itself.
  242.  
  243.  =============================================================================
  244.  
  245.                        What You'll Need to Compile
  246.  
  247.           In order to compile a program using Centiwrite, you need to copy
  248. CENTWRI5.TPU into the directory where Turbo Pascal normally looks for your
  249. .TPU files. In version 5.0, this is one of the EXE & TPU directories specified
  250. under the Options/Directories menu selection. You will also need to add the
  251. line "uses centwri5;" to the the source file of the procedure that calls the
  252. editor. Check your Turbo Pascal manual for additional information on including
  253. units in your programs. Oh, yes, you'll also need Turbo Pascal version 5.0.
  254. For those concerned about needing to recompile for future versions of the
  255. compiler, the current plan is to update the unit whenever a new version of
  256. Turbo Pascal is released. Upgrades will be available for a modest charge.
  257.  
  258.           With the advent of Turbo Pascal 5.5, units may incorporate object-
  259. oriented programming techniques. This means that a unit such as this one could
  260. be distributed as a .TPU file, yet a user could make changes to it without
  261. the need for the source code. If possible, the Developer's Kit will be
  262. revised to take advantage of this opportunity.
  263.  
  264.  =============================================================================
  265.  
  266.                            The Basic Principles
  267.  
  268.           The Centiwrite editor is based upon an "array of strings"
  269. implementation. While not suitable for a large text editor or word processor,
  270. this approach is quite adequate for a simple program such as this. It allows
  271. a "quick and dirty" style, and is easily understandable. Each element in the
  272. array of strings represents a line of text on the screen. An "implied"
  273. carriage return ends each line. A count of the current number of lines is
  274. maintained at all times. A duplicate array is maintained in memory in order
  275. to facilitate the "Undo" feature (invoked by F3).
  276.  
  277.           Some may wonder why the video memory is not used to store the
  278. text, considering that the text is stored there anyway. Use of character
  279. strings allows the use of Turbo Pascal's string-handling procedures. Using
  280. video memory would mean writing substantially more code in order to duplicate
  281. the functions already available in the runtime library. This code would not
  282. only make the program larger, but would also need to be debugged. The Turbo
  283. Pascal string-handling routines (while not perfect) are already thoroughly
  284. debugged.
  285.  
  286.  =============================================================================
  287.  
  288.                         A Sample Calling Procedure
  289.  
  290.           The following program is an example of how to call the editor.
  291.  
  292. program CallEditor (input, output);
  293. uses dos, crt, centwri5;
  294. var reg: registers;
  295. origcx: word;
  296. cwinfo: commstruc;
  297. i: byte;
  298. hours, minutes, seconds, hundredths: word;
  299.  
  300. procedure SaveFile;
  301. begin
  302. writeln ('Code for saving a file would be here.');
  303. delay (2500);
  304. end;
  305.  
  306. procedure HelpProcedure;
  307. begin
  308. writeln ('Help! Help!');
  309. delay (2500);
  310. end;
  311.  
  312. begin
  313. reg.ah:= $03;
  314. reg.bh:= $00;
  315. intr ($10, reg);  { Save old cursor }
  316. origcx:= reg.cx;
  317. reg.ah:= $01;
  318. reg.cx:= $2000;
  319. intr ($10, reg);  { Disable hardware cursor }
  320. with cwinfo do    { Allows unqualified variable references. }
  321. begin
  322. insmode:= true;     { Initialize structure variables. }
  323. initWhereX:= 1;
  324. initWhereY:= 1;
  325. CurAttr:= $70;  { Black on LightGray }
  326. StdAttr:= $17;  { LightGray on Blue }
  327. MessAttr:= $20; { Black on Green }
  328. WarnAttr:= $4F; { White on Red }
  329. for i:= 1 to 25 do
  330.     screline[i]:= '';  { empty file }
  331. lastring:= 1;
  332. passkey:= 0;
  333. RetCtrlKeys:= false;
  334. ShowStatusLine:= true;
  335. BlankChar:= #32; { pick the blank character because of the CurAttr we used }
  336. TimeOutInterval:= 5;  { causes a timeout every five minutes }
  337. GetTime (hours, minutes, seconds, hundredths);
  338. NextTimeOut:= minutes+ TimeOutInterval;   { set first timeout }
  339. oldhours:= hours;     { initialize rollover flag }
  340. repeat
  341.    window (1, 1, 80, 25);
  342.    TextAttr:= $07;
  343.    ClrScr;
  344.    writeln ('Joe''s Program: Centiwrite Editor-- Alt-X to Exit');
  345.    window (1, 2, 80, 25);
  346.    Centiwrite (cwinfo);      { <------------- PLUG-IN EDITOR }
  347.    window (1, 1, 80, 25);
  348.    TextAttr:= $07;
  349.    if TimeOut     { Short-circuit the other tests-- passkey contains }
  350.       then begin  { values which have already been processed. }
  351.            passkey:= 0;
  352.            end;
  353.    if ((passkey= 346) or (passkey= 316)) or (TimeOut)
  354.       { If Alt-X, F2, or TimeOut, save the file. }
  355.       then SaveFile;
  356.    if passkey= 315  { F1 displays a list of keys and their functions. }
  357.       then HelpProcedure;
  358. until ((passkey= 288) or (passkey= 346));  { Alt-D or Alt-X (exit condition) }
  359. end;  { with statement }
  360. ClrScr;
  361. reg.ah:= $01;
  362. reg.cx:= origcx;
  363. intr ($10, reg); { restore cursor }
  364. end.  { program }
  365.  
  366.  =============================================================================
  367.  
  368.                        Analysis of the Sample Program
  369.  
  370.           Take a close look at the sample program. Although it has been
  371. simplified in order to highlight the main points, its basic structure is
  372. the same as that of the stand-alone version of Centiwrite 1.10. You should
  373. be able to compile and run it. It gives initial values to the members of the
  374. structure, and then runs the editor in a repeat..until loop.
  375.  
  376.           Why a loop? This is the means you can use to add your own "frills"
  377. to the editor. Any time the Centiwrite editor sees a key that it does not
  378. recognize, such as F9, Alt-Z, or PageDown, the editor terminates and control
  379. returns to the calling procedure. Placing the editor in a loop gives you a
  380. chance to execute whatever procedures or functions you like before RETURNING
  381. control, or exiting if you like. For example, Alt-X is the "recommended" exit
  382. key. The editor takes no special action on seeing Alt-X; it merely exits just
  383. the same as it would for any other unrecognized key. The "until" condition
  384. "passkey=288" is what causes the sample program to terminate. To use F10 as
  385. an exit key, just change the condition to "passkey=324". Likewise, what
  386. displays help is "passkey=315"; to use Shift-F1, change to "passkey=340".
  387.  
  388.          Note that the editor recognizes all keys that return an ASCII value
  389. plus the following extended keys:
  390.  
  391. arrow keys        Shift-Tab          Ctrl-Left arrow       Alt- B E H T V Y
  392. Insert            Home/End           Ctrl-Right arrow      F3  F5  F7  F8
  393. Delete            Ctrl-Home/End      Ctrl-F8
  394.  
  395.          The calling procedure is passed any other keys and may deal with them
  396. however it sees fit. The variable "passkey" will hold the value of the last
  397. key pressed. By using the flag RetCtrlKeys, you can specify additional keys
  398. to be returned.
  399.  
  400.           Notice the "window" statement just before the call to Centiwrite.
  401. This is absolutely necessary in order for the editor to establish its window
  402. boundaries and insure the integrity of its screen. The editor can operate
  403. in a window no narrower than 40 columns. It has not been tested in windows
  404. of fewer than 24 rows; however, it should work for any number of rows.
  405. (For a single row "window" you should use "liminput", the complete source
  406. code to which is found in the Deciwrite Developer's Kit.) If you specify a
  407. window size of fewer than 40 columns, greater than the screen width, or
  408. greater than the screen height, the result is unknown.
  409.  
  410.           The Centiwrite editor redraws its window each time it is called, and
  411. it leaves the screen in place when it exits. Therefore, you can put a window
  412. over it without any trouble.
  413.  
  414.  ============================================================================
  415.  
  416.                           The Initial Values
  417.  
  418.           The most important value in "commstruc" is "lastring". If you use
  419. an invalid value for lastring, the editor will become confused and behave
  420. erratically. Lastring should be 1 for an empty file. Otherwise, it reflects
  421. the number of currently valid strings in the array "screline".
  422.  
  423. Example.
  424.  
  425. If screline is this (line numbers added):
  426.  
  427. [1] Now is the time for all good people.
  428. [2] We must mobilize now.
  429. [3]
  430. [4] May we have your support?
  431.  
  432. then lastring is 4. If two carriage returns are added after line 4, as in
  433.  
  434. [4] May we have your support?
  435. [5]
  436. [6]
  437.  
  438. then lastring is 6. Lastring should only be changed when the number of lines
  439. in the text is changed.
  440.  
  441.           Here's an important note about carriage returns. The Centiwrite
  442. editor does NOT add the ASCII 13-10 combination explicitly to the text. Every
  443. string ends in an IMPLIED 13-10. If you write a file to disk, you must add the
  444. 13-10 yourself. This is easily done using a "writeln(screline[i])"-type
  445. statement. You need not delete a 13-10 on input, however, as the editor
  446. automatically removes these (as well as ASCII 7 and 8) from the text. You
  447. should, however, take care to format the input strings so that they do not
  448. contain embedded carriage returns that really belong at the end of a line.
  449.  
  450.           InitWhereX and initWhereY are used to position the cursor when
  451. the editor is called. For the first invocation, each of these should usually be
  452. set to 1, although any valid values are acceptable. Never position the cursor
  453. below the row "lastring", or erratic operation will result. When the editor
  454. passes control back to the calling procedure, the current cursor position is
  455. saved in initWhereX and initWhereY. It can then be reused if necessary when
  456. the editor is called again. Pressing F9 demonstrates this simply. The cursor
  457. position is saved; the editor returns control to the main program; the main
  458. program ignores the key (because no function has been defined for it there,
  459. either); and the editor regains control, positioning the cursor at the saved
  460. location.
  461.  
  462.           Insmode, as explained earlier, is simply a flag. It's your choice--
  463. set it however you like depending upon whether you want to start the editor in
  464. Insert mode or Overstrike mode.
  465.  
  466.           Passkey must be initialized. If a timeout occurs before the first
  467. key is pressed, the internal check of passkey will fail if passkey
  468. contains garbage.
  469.  
  470.           You must also initialize BlankChar, RetCtrlKeys, and ShowStatusLine.
  471. They are explained previously.
  472.  
  473.           You do not have to initialize TimeOut, because it is set to
  474. false each time the editor is called.
  475.  
  476.  ============================================================================
  477.  
  478.                            Initializing the Array
  479.  
  480.           You must initialize "screline" before using it. This can be done
  481. any way you like-- with assignment statements, reads, Move, etc. You should
  482. assign an initial value to "maxline" elements in screline, where "maxline" is
  483. equal to the maximum number of lines on the screen plus 1. Be sure to keep
  484. "lastring" synchronized with the actual number of elements of screline in use.
  485.  
  486.  =============================================================================
  487.  
  488.                           How to Overlay the Unit
  489.  
  490.          This unit is compiled using {$O+}. This means that you may
  491. overlay it using the methods outlined in Chapter 13 of the Turbo Pascal
  492. Reference Guide, just as you would do for any other unit compiled with {$O+}.
  493. If you do not want to overlay the unit, simply ignore this feature. While it
  494. has not been tested as an overlay, it should work just as well either way.
  495.  
  496.  =============================================================================
  497.  
  498.                          Compatibility Consideration
  499.  
  500.           The Centiwrite editor uses direct screen writes (through Turbo
  501. Pascal's CRT unit). This may cause problems, particularly with windowing
  502. environments such as Desqview or Concurrent DOS. If you need to write to
  503. the screen using the video BIOS functions, place the line "uses crt" in
  504. your main program and set the built-in CRT variable DirectVideo to "false".
  505. Otherwise, DirectVideo will be assumed to be "true".
  506.  
  507.  =============================================================================
  508.  
  509.                        For Extra Punch in Your Program
  510.  
  511.           If you want to use a "plug-in editor" in your program, but feel
  512. Centiwrite just isn't powerful enough, don't walk away feeling dejected.
  513. Here's good news! Also available is an editor similar to Centiwrite but ten
  514. times as powerful. It's Deciwrite! The Deciwrite Developer's Kit includes all
  515. the features of Centiwrite PLUS:
  516.  
  517. 1. Automatic word wrap and paragraph reformatting.
  518. 2. Full support for binary files.
  519. 3. Time and date can be inserted into the text with one keystroke.
  520. 4. Full source code-- including liminput, a replacement for readln; dectohex
  521.    and hextodec, hexadecimal conversion routines; and FileCheck, which checks
  522.    for the existence of a file and determines if it is read-only; and more!
  523.  
  524.           What's more, if you're not sure, you can "lock in" the price of
  525. the Deciwrite Developer's Kit by buying the Centiwrite Developer's Kit NOW.
  526. You'll have one year to upgrade at the current price (plus $1 for shipping),
  527. PLUS you get a credit for what you paid for the Centiwrite Developer's Kit.
  528. What's to lose? Send electronic mail to the addresses listed earlier to learn
  529. how to take advantage of this great offer. Don't forget, too, that the
  530. Deciwrite Developer's Kit comes with a 30-day money-back guarantee no matter
  531. when you buy it.
  532.  
  533.  =============================================================================
  534.  
  535.                            Down to Brass Tacks
  536.  
  537.       As of July 1, 1989, this is the Centiwrite/Deciwrite price list.
  538.  
  539.                                     Individual License        Site License
  540. *#    Centiwrite 1.10                    $20.00                  $250.00
  541.  #    Deciwrite  1.10                    $30.00                  $500.00
  542.       Deciwrite  1.10 Demo Disk          $ 4.00                  *******
  543. *#    Centiwrite 1.10 Developer's Kit    $32.50                  $550.00
  544.         Upgrade to later version         $ 5.00                  $ 60.00
  545.  #    Deciwrite 1.10 Developer's Kit     $75.00                  $950.00
  546.       Disk replacement fee               $ 3.00                    none
  547.  
  548.     * These items may be ordered through the Public (Software) Library;
  549.       others must be ordered directly from the author.
  550.  
  551.     # Please add $4.00 shipping & handling to these items.
  552.  
  553.       New York State residents and businesses MUST add their local sales tax
  554.       or provide proof of exemption. Send electronic mail if you are uncertain
  555.       of your local tax rate. Specify your address and county. The shipping
  556.       and handling charge is NOT included in the calculation of sales tax.
  557.  
  558.       Residents of other states will in most cases be required to remit the
  559.       appropriate tax directly to their state tax department.
  560.  
  561.       The Deciwrite Demo Disk includes one $3.00 discount off the purchase
  562.       of Deciwrite 1.10.
  563.  
  564.       An individual license permits the user to operate the program on
  565.       a single computer at a time, while a site license permits unlimited use
  566.       within the confines of a contiguous area of the owner's property.
  567.  
  568.       These prices are guaranteed not to increase through October 1, 1989.
  569.  
  570.       Custom implementations of these programs are also available on
  571.       request for modest additional fees. Send electronic mail to one
  572.       of the addresses listed earlier.
  573.  
  574.       If you would like to use your Visa or MasterCard to register this
  575.       program, you may order through the Public (Software) Library.
  576.       The number to call for orders is 1-800-2424-PSL (1-800-242-4775).
  577.       Information and questions about orders is available from the PSL
  578.       at 713-665-7017. You may also write to the PSL at P.O. Box 35707,
  579.       Houston, TX 77235-5705, or send electronic mail via CompuServe to
  580.       71355,470. When writing, you should sign your letter, include your
  581.       card number and its expiration date, and specify that you want to
  582.       register Centiwrite, (CWDKIT5.ARC), by Andrew M. Saucci, Jr. Please
  583.       note that the PSL is not equipped to answer questions about Centiwrite
  584.       itself. Such questions are best directed to one of the electronic
  585.       mail addresses listed earlier. Also note that no surcharge
  586.       is imposed on credit card orders.
  587.  
  588.       Make checks payable to
  589.  
  590.       Andrew M. Saucci, Jr.
  591.       641 Koelbel Ct
  592.       Baldwin, NY 11510-3915.
  593.  
  594.       Please specify the disk size you require.
  595.  
  596.       You may wish to check one of the electronic mail addresses to verify
  597.       that the above address is current. Please use this "physical" address
  598.       ONLY for orders, unless you lack a modem. All other correspondence,
  599.       including technical support questions, should be directed to one of
  600.       the electronic mail addresses whenever possible.
  601.  
  602.  ============================================================================
  603.  
  604.               Before Going to the Highest Court in the Land
  605.  
  606.    This program is produced by a member of the Association of Shareware
  607. Professionals (ASP).  ASP wants to make sure that the shareware principle
  608. works for you. If you are unable to resolve a shareware-related problem with
  609. an ASP member by contacting the member directly, ASP may be able to help. The
  610. ASP Ombudsman can help you resolve a dispute or problem with an ASP member,
  611. but does not provide technical support for members' products. Please write to
  612. the ASP Ombudsman at P.O. Box 5786, Bellevue, WA 98006 or send a CompuServe
  613. message via EasyPlex to ASP Ombudsman 70007,3536.
  614.  
  615.  ============================================================================
  616.  
  617.                              Special Bonus
  618.  
  619.           All registered users of the Centiwrite Developer's Kit are also
  620. licensed to use the stand-alone version of Centiwrite (CWRITE.EXE) at no
  621. additional charge. CWRITE.EXE is included on the distribution disk that will
  622. be sent to you when your order is received. Also, registered users receive
  623. the source code for DIRALL.EXE, one of the programs provided to registered
  624. users of the stand-alone version of Centiwrite. DIRALL.EXE provides a
  625. regular directory listing, but highlights hidden files in boldface.
  626.  
  627.           A registered user is also entitled to unlimited telephone, U. S.
  628. mail, or electronic mail support. If such a user finds a bug within three
  629. months of purchase, it will either be fixed or the purchase price will be
  630. refunded.
  631.  
  632.  ============================================================================
  633.  
  634.                                Boilerplate
  635.  
  636.           Liability in the event of defects in Centiwrite 1.10 and/or the
  637. Centiwrite 1.10 Developer's Kit is expressly limited to replacement of the disk
  638. on which Centiwrite and/or the Developer's Kit was originally provided. No
  639. other liability of any sort is either implied or assumed. In particular, the
  640. user is responsible for all consequential damages, such as loss of income,
  641. loss of data, pain and suffering, etc.
  642.  
  643.  ============================================================================
  644.  
  645.                         To All Those Who Helped
  646.  
  647.           Thanks to all those who gave their assistance toward the completion
  648. of this program, especially Michael Day, Neil Rubenking, Scott Bussinger, and
  649. all the other helpful people who frequent Borland's Programming Forum A
  650. (BPROGA) on CompuServe. It's truly amazing!
  651.  
  652.  ============================================================================
  653.  
  654.                            Coming Attractions
  655.  
  656.           A plan to produce a full-size text editor based on Centiwrite and
  657. Deciwrite is in the works. Please use Centiwrite to write a short note
  658. describing a few of the features you would like to see in a text editor,
  659. particularly anything that is not found in other programs, and send it to one
  660. of the electronic mail addresses. The result could be a really good program.
  661. You might also indicate what incentives are most likely to cause you to
  662. purchase registered copies of programs distributed on a "try-before-you-buy"
  663. basis. Your suggestions will be most appreciated.
  664.  
  665.  ============================================================================
  666.  
  667.                                It's Alive!
  668.  
  669.           This program is not carved in stone. Many of you no doubt have
  670. extensive experience in this field, and your comments and suggestions are
  671. valuable and welcome. Send them to the electronic mail addresses listed.
  672.  
  673.  ============================= END OF FILE ===================================
  674.